package com.blb.ioc.demo3;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

/**
 * 工厂模式
 */
public class ComputerFactory {

    public Object getBean(Class clazz) throws IllegalAccessException, InstantiationException {
        // 反射创建对象
        Object obj = clazz.newInstance();
        // 找到类里面所有的属性
        Field[] fields = clazz.getDeclaredFields();
        // 遍历所有属性
        for (Field field : fields) {
            // 判断有没有MyValue注解
            MyValue myValue = field.getDeclaredAnnotation(MyValue.class);
            if (myValue != null){
                // 读取配置的字符串
                String value = myValue.value();
                // 把值赋值给属性
                field.setAccessible(true);
                field.set(obj,value);
            }
            // 判断MyComponent注解
            MyComponent component = field.getDeclaredAnnotation(MyComponent.class);
            if (component != null){
                // 读取组件的类型
                Class componentClass = component.value();
                // 创建组件对象
                Object compoentObj = componentClass.newInstance();
                // 将组件对象赋值给属性
                field.setAccessible(true);
                field.set(obj,compoentObj);
            }
        }
        return obj;
    }
}
